﻿/// <summary>
/// Classe qui représente un champ dont on veut contôler la propriété value par code.
/// Ce champ ne met pas à jour la bd.
/// Exemple d'utilisation de cette classe: Si on désire affiché le résultat d'une fonction par code.
/// </summary>
/// <remarks></remarks>
/// 
using System;
namespace Framework.Data.Core
{
    public class CustomField : BaseField
    {

        #region "Propriétés"
        public override object Value
        {
            get
            {
                PropertyEventArgs e = new PropertyEventArgs();
                e.PropertyValue = base.Value;
                if (GetValue != null)
                {
                    GetValue(this, e);
                }
                return e.PropertyValue;
            }
            set
            {
                PropertyEventArgs e = new PropertyEventArgs();
                e.PropertyValue = base.Value;
                if (SetValue != null)
                {
                    SetValue(this, e);
                }
            }
        }
        #endregion

        #region "Constructeurs"

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="entity">Entité qui contient le champ</param>
        /// <param name="name">nom du champ</param>
        /// <param name="fieldValueType">Type du champ</param>
        /// <remarks></remarks>
        public CustomField(IBaseEntity entity, string name, Type fieldValueType)
            : this(entity, name, fieldValueType, false)
        {
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="entity">Entité qui contient le champ</param>
        /// <param name="name">nom du champ</param>
        /// <param name="fieldValueType">Type du champ</param>
        /// <param name="readOnly">Indique si la champ est en lecture seule</param>
        /// <remarks></remarks>
        public CustomField(IBaseEntity entity, string name, Type fieldValueType, bool readOnly)
            : this(entity, name, fieldValueType, readOnly, true)
        {
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="entity">Entité qui contient le champ</param>
        /// <param name="name">nom du champ</param>
        /// <param name="fieldValueType">Type du champ</param>
        /// <param name="readOnly">Indique si la champ est en lecture seule</param>
        /// <param name="displayFieldInList">Indique si le champ doit être affiché dans les listes de sélection</param>
        /// <remarks></remarks>
        public CustomField(IBaseEntity entity, string name, Type fieldValueType, bool readOnly, bool displayFieldInList)
            : this(entity, name, fieldValueType, readOnly, displayFieldInList, true)
        {
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="entity">Entité qui contient le champ</param>
        /// <param name="name">nom du champ</param>
        /// <param name="fieldValueType">Type du champ</param>
        /// <param name="readOnly">Indique si la champ est en lecture seule</param>
        /// <param name="displayFieldInList">Indique si le champ doit être affiché dans les listes de sélection</param>
        /// <param name="displayFieldInEditableList">Indique si le champ doit être affiché dans les listes d'édition</param>
        /// <remarks></remarks>
        public CustomField(IBaseEntity entity, string name, Type fieldValueType, bool readOnly, bool displayFieldInList, bool displayFieldInEditableList)
            : this(entity, name, fieldValueType, readOnly, displayFieldInList, displayFieldInEditableList, name)
        {
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="entity">Entité qui contient le champ</param>
        /// <param name="name">nom du champ</param>
        /// <param name="fieldValueType">Type du champ</param>
        /// <param name="readOnly">Indique si la champ est en lecture seule</param>
        /// <param name="displayFieldInList">Indique si le champ doit être affiché dans les listes de sélection</param>
        /// <param name="displayFieldInEditableList">Indique si le champ doit être affiché dans les listes d'édition</param>
        /// <param name="listColumnName">Clé ZETA qui permet de localiser le nom de la colonne dans la liste</param>
        /// <remarks></remarks>
        public CustomField(IBaseEntity entity, string name, Type fieldValueType, bool readOnly, bool displayFieldInList, bool displayFieldInEditableList, string listColumnName)
            : base(entity, name, fieldValueType, readOnly, displayFieldInList, displayFieldInEditableList, listColumnName)
        {
        }

        #endregion

        #region "Events / Delegates"

        public delegate void PropertyEventHandler(object sender, PropertyEventArgs e);
        public event PropertyEventHandler GetValue;
        public event PropertyEventHandler SetValue;

        #endregion

        #region "Méthodes"
        /// <summary>
        /// Propriété qui indique si le champs à changé.
        /// Elle retoune toujours faux
        /// </summary>
        /// <value>Boolean</value>
        /// <returns>Boolean</returns>
        /// <remarks></remarks>
        public override bool IsDirty
        {
            get { return false; }
        }

        /// <summary>
        /// Propriété qui est utiliser pour formatter les valeur dans les liste
        /// </summary>
        /// <returns>String</returns>
        /// <remarks></remarks>
        public override string DisplayText
        {
            get
            {
                if (this.Value != null)
                {
                    if (this._formatString != null && this._formatProvider != null)
                    {
                        return string.Format(this.FormatProvider, "{0}", this._value);
                    }
                    else
                    {
                        return this.ToString();
                    }
                }
                else
                {
                    return string.Empty;
                }
            }
        }

        #endregion

    }

    /// <summary>
    /// Classe d'argement pour le délégate PropertyEventHandler 
    /// </summary>
    /// <remarks></remarks>
    public class PropertyEventArgs : EventArgs
    {
        public object PropertyValue;
    }
}